/* * Copyright (C) 2014 IUH �yber$oft Team * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package vn.cybersoft.obs.android.fragments; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.OptionalDataException; import java.io.StreamCorruptedException; import java.util.Arrays; import vn.cybersoft.obs.andriod.batterystats2.service.BatteryStats; import vn.cybersoft.obs.andriod.batterystats2.service.ICounterService; import vn.cybersoft.obs.andriod.batterystats2.service.UidInfo; import vn.cybersoft.obs.andriod.batterystats2.util.Counter; import vn.cybersoft.obs.andriod.batterystats2.util.SystemInfo; import vn.cybersoft.obs.android.R; import vn.cybersoft.obs.android.application.OBS; import vn.cybersoft.obs.android.preference.PowerGaugePreference; import vn.cybersoft.obs.android.utilities.Log; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.RemoteException; import android.preference.PreferenceGroup; import android.support.v4.preference.PreferenceFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ConsumptionFragment extends PreferenceFragment { private static final String TAG = "ConsumptionFragment"; public static final int LAYOUT_ID = R.layout.consumption_fragment; private static final String KEY_APP_LIST = "app_list"; private static final double HIDE_UID_THRESHOLD = 0.1; private ICounterService mCounterService; private PreferenceGroup mAppListGroup; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActivity().setTitle(getString(R.string.app_name) + " > " + getString(R.string.consumption)); mCounterService = OBS.getInstance().getCounterService(); if (mCounterService == null) { Log.e("in " + TAG + "Can't get counter service !!!!"); } addPreferencesFromResource(R.xml.power_usage_summary); mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST); setHasOptionsMenu(true); } @Override public void onResume() { super.onResume(); refreshStats(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(LAYOUT_ID, container, false); return view; } private void refreshStats() { mAppListGroup.removeAll(); mAppListGroup.setOrderingAsAdded(false); try { int noUidMask = mCounterService.getNoUidMask(); byte[] rawUidInfo = mCounterService.getUidInfo(Counter.WINDOW_TOTAL, noUidMask | 0); if (rawUidInfo != null) { UidInfo[] uidInfos = (UidInfo[]) new ObjectInputStream(new ByteArrayInputStream(rawUidInfo)).readObject(); double total = 0; for (UidInfo uidInfo : uidInfos) { if (uidInfo.uid == SystemInfo.AID_ALL) continue; uidInfo.key = uidInfo.totalEnergy; uidInfo.unit = "J"; total += uidInfo.key; } if (total == 0) { total = 1; } for (UidInfo uidInfo : uidInfos) { uidInfo.percentage = (uidInfo.key / total) * 100; } Arrays.sort(uidInfos); for (int i = 0; i < uidInfos.length; i++) { UidInfo info = uidInfos[i]; final double percentOfTotal = info.percentage; if (info.uid == SystemInfo.AID_ALL || percentOfTotal < HIDE_UID_THRESHOLD) { continue; } PackageManager packageManager = getActivity().getPackageManager(); SystemInfo systemInfo = SystemInfo.getInstance(); String name = systemInfo.getUidName(info.uid, packageManager); if (name.equals(getString(R.string.app_name))) { continue; } Drawable icon = systemInfo.getUidIcon(info.uid, packageManager); PowerGaugePreference pref = new PowerGaugePreference(getActivity(), icon, info); pref.setTitle(name); pref.setOrder(Integer.MAX_VALUE - (int) info.key); pref.setPercent(percentOfTotal, percentOfTotal); pref.setKey(Integer.toString(info.uid)); mAppListGroup.addPreference(pref); } } } catch (RemoteException e) { e.printStackTrace(); } catch (OptionalDataException e) { e.printStackTrace(); } catch (StreamCorruptedException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }